package 算法.NiuKe.JZ;

/**
 * @author:谢君臣
 * @Date:2021/4/309:47
 * @version:1.0
 * @function:   地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动，每一次只能向左，右，上，下四个方向移动一格，
 * 但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如，当k为18时，机器人能够进入方格（35,37），因为3+5+3+7 = 18。
 * 但是，它不能进入方格（35,38），因为3+5+3+8 = 19。请问该机器人能够达到多少个格子？
 */
public class JZ67 {
    public static void main(String[] args) {
        System.out.println(movingCount(15,100,1));
    }
    public static int movingCount(int threshold, int rows, int cols) {
        if (threshold<0)
            return 0;
        int count = 1;
        int[][]path = new int[rows][cols];
        path[0][0] = 1;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                int x = 0,y=0;
                char[] chars = String.valueOf(i).toCharArray();
                for (char c : chars)
                    x += c-'0';
                chars = String.valueOf(j).toCharArray();
                for (char c : chars)
                    y += c-'0';
                if (x+y<=threshold&&check(path,i,j)){
                    path[i][j] = 1;
                    count++;
                }else break;
            }
        }
        return count;
    }

    private static boolean check(int[][] path, int i, int j) {
        boolean top = false;
        boolean bottom = false;
        boolean left = false;
        boolean right = false;
        if (i-1>=0&&path[i-1][j]==1)top = true;
        //if (i+1<path.length&&path[i+1][j]==1)bottom = true;
        if (j-1>=0&&path[i][j-1]==1)left = true;
        //if (j+1<path[0].length&&path[i][j+1]==1)right = true;
        return top||left||right||bottom;
    }
}
